<?php
/**
 * Created by PhpStorm.
 * User: Dundee
 * Date: 2016/1/6
 * Time: 9:33
 */
class WeChatAccess_token{

    private $appid;//第三方用户唯一凭证
    private $appsecret;//第三方用户唯一凭证密钥
    private $token;//开发者自己定义

    public function __construct($appid,$appsecret,$token){
        $this->appid=$appid;
        $this->appsecret=$appsecret;
        $this->token=$token;
    }

    /**
     * @param $curl string 链接
     * @param bool|true $https 传输协议
     * @param string $method 提交方式
     * @param null $data 数据
     * @return mixed 返回JSON 格式数据
     */
    public function gainCurl($curl,$https=true,$method='GET',$data=null){
        $ch=curl_init();//初始化cURL资源
        //设置URL和相应的选项
        curl_setopt($ch,CURLOPT_URL,$curl);//设置URL
        curl_setopt($ch,CURLOPT_HEADER,false);//不将头文件的信息作为数据流输出。
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//将curl_exec()获取的信息以文件流的形式返回，而不是直接输出。

        //判断安全协议
        if($https){
            curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);//禁用后cURL将终止从服务端进行验证
            curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,true);
        }

        //判断传出方式
        if($method=='POST'){
            curl_setopt($ch,CURLOPT_POST,true);//启用时会发送一个常规的POST请求，类型为：application/x-www-form-urlencoded，就像表单提交的一样。
            curl_setopt($ch,CURLOPT_POSTFIELDS,$data);//全部数据使用HTTP协议中的"POST"操作来发送。
        }

        $content=curl_exec($ch);//执行给定的cURL会话。
        curl_close($ch);//关闭一个cURL会话
        return $content;
    }

    /**
     * @return mixed 得到票据字符串
     */
    public function getAccess_token(){
        $file='../Config/Access_token';//存放Access_token票据的文件
        //判断是否存在
        if(file_exists($file)){
          $cont= file_get_contents($file);
            $arr=json_decode($cont,true);
            //判断是否过了有效时间
            if(time()-filemtime($file)<$arr['expires_in']){
                return $arr['access_token'];
            }
        }
            $curl='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->appsecret;
            $json= $this->gainCurl($curl);
            file_put_contents($file,$json);
            $arr=json_decode($json,true);
            return $arr['access_token'];

    }

    /**
     * @param $scene_id 场景值ID
     * @param string $QRCode_type 二维码的类型
     * @param int $expire_seconds 有效时间
     * @return mixed 获得二维码令牌
     */
    public function getTicket($scene_id,$QRCode_type='temp',$expire_seconds=604800){
        if($QRCode_type=='temp'){
            $data='{"expire_seconds": %s, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": %s}}}';
            $data=sprintf($data,$expire_seconds,$scene_id);
        }else{
            $data='{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": %s}}}';
            $data=sprintf($data,$scene_id);
        }
        $curl='https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$this->getAccess_token();
        $json=$this->gainCurl($curl,true,'POST',$data);
        $arr=json_decode($json,true);
        return $arr['ticket'];
    }

    /**
     * @param $scene_id 场景值ID
     * @param string $QRCode_type 二维码的类型
     * @param int $expire_seconds 有效时间
     * @return mixed 获得二维码
     */
    public function getQRCode($scene_id,$QRCode_type='temp',$expire_seconds=604800){
        $ticket=$this->getTicket($scene_id,$QRCode_type='temp',$expire_seconds=604800);
        $curl='https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.urlencode($ticket);
        $QRCode=$this->gainCurl($curl);
        return $QRCode;
    }

}
?>